<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>{foreach},{foreachelse}</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
<link rel="home" href="index.html" title="Руководство по Smarty">
<link rel="up" href="language.builtin.functions.html" title="Chapter 7. Встроенные функции">
<link rel="prev" href="language.function.config.load.html" title="{config_load}">
<link rel="next" href="language.function.if.html" title="{if},{elseif},{else}">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">{foreach},{foreachelse}</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
<th width="60%" align="center">Chapter 7. Встроенные функции</th>
<td width="20%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="sect1" title="{foreach},{foreachelse}">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="language.function.foreach"></a>{foreach},{foreachelse}</h2></div></div></div>
<p>
  <code class="varname">{foreach}</code> используется для работы как с
  <span class="bold"><strong>ассоциативным</strong></span>,
  так и с числовыми массивами, в отличие от функции
  <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>,
  которая предназначена для работы
  <span class="bold"><strong>исключительно с числовыми массивами</strong></span>.
  
  Синтаксис функции <code class="varname">{foreach}</code> намного проще, чем
  <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>,
  но она может работать <span class="bold"><strong>только с одним массивом</strong></span>
  одновременно. Каждый тэг <code class="varname">{foreach}</code> должен иметь
  закрывающую пару <code class="varname">{/foreach}</code>.
 </p>
<div class="informaltable"><table border="1">
<colgroup>
<col align="center">
<col align="center">
<col align="center">
<col align="center">
<col>
</colgroup>
<thead><tr>
<th align="center">Имя атрибута</th>
<th align="center">Тип</th>
<th align="center">Обязателен</th>
<th align="center">По умолчанию</th>
<th>Описание</th>
</tr></thead>
<tbody>
<tr>
<td align="center">from</td>
<td align="center">array</td>
<td align="center">Да</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>Массив, по которому надо пройтись</td>
</tr>
<tr>
<td align="center">item</td>
<td align="center">string</td>
<td align="center">Да</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>Имя переменной, которая будет значением текущего елемента</td>
</tr>
<tr>
<td align="center">key</td>
<td align="center">string</td>
<td align="center">Нет</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>Имя переменной, которая будет ключом текущего елемента</td>
</tr>
<tr>
<td align="center">name</td>
<td align="center">string</td>
<td align="center">Нет</td>
<td align="center"><span class="emphasis"><em>n/a</em></span></td>
<td>Название цикла foreach для доступа к его свойствам</td>
</tr>
</tbody>
</table></div>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
    Атрибуты <em class="parameter"><code>from</code></em> и <em class="parameter"><code>item</code></em>
    являются обязательными.
   </p></li>
<li class="listitem"><p>
    Параметр <em class="parameter"><code>name</code></em> цикла <code class="varname">{foreach}</code>
    может состоять из букв, цифр и знака подчеркивания, как и
   <a class="ulink" href="http://php.net/language.variables" target="_top">переменные PHP</a>.
   </p></li>
<li class="listitem"><p>
    Циклы <code class="varname">{foreach}</code> могут быть вложенными при условии, что
    их имена будут уникальными.
   </p></li>
<li class="listitem"><p>
    Атрибут <em class="parameter"><code>from</code></em>, обычно являющийся массивом,
    определяет количество проходов цикла <code class="varname">{foreach}</code>.
   </p></li>
<li class="listitem"><p>
    Блок <code class="varname">{foreachelse}</code> выполняется в том случае, если 
    в параметре <em class="parameter"><code>from</code></em> нет значений.
   </p></li>
<li class="listitem">
<p>
    У циклов <code class="varname">{foreach}</code> также есть собственные переменные,
    которые обрабатывают свойства.
    Доступ к ним можно получить таким образом:
    <a class="link" href="language.variables.smarty.html#language.variables.smarty.loops" title="{$smarty.section}, {$smarty.foreach}">
    <em class="parameter"><code>{$smarty.foreach.name.property}</code></em></a>, где
    <span class="quote">“<span class="quote">name</span>”</span> - атрибут <em class="parameter"><code>name</code></em> функции
    <code class="varname">{foreach}</code>.
   </p>
<div class="note" title="Обратите внимание" style="margin-left: 0.5in; margin-right: 0.5in;">
<h3 class="title">Обратите внимание</h3>
<p>
     Атрибут <em class="parameter"><code>name</code></em> необходим только в том случае,
     когда у вас есть необходимость обращаться к свойствам
     <code class="varname">{foreach}</code>, в отличие от функции
     <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>.
     Обращение к свойствам <code class="varname">{foreach}</code> с неопределенным
     <em class="parameter"><code>name</code></em> не вызывает ошибки, но ведёт к непредсказуемым
     результатам.
    </p>
</div>
</li>
<li class="listitem"><p>
    <code class="varname">{foreach}</code> имеет следующие свойства:
    <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>,
    <a class="link" href="language.function.foreach.html#foreach.property.iteration" title=".iteration"><em class="parameter"><code>iteration</code></em></a>,
    <a class="link" href="language.function.foreach.html#foreach.property.first" title=".first"><em class="parameter"><code>first</code></em></a>,
    <a class="link" href="language.function.foreach.html#foreach.property.last" title=".last"><em class="parameter"><code>last</code></em></a>,
    <a class="link" href="language.function.foreach.html#foreach.property.show" title=".show"><em class="parameter"><code>show</code></em></a> и
    <a class="link" href="language.function.foreach.html#foreach.property.total" title=".total"><em class="parameter"><code>total</code></em></a>.
   </p></li>
</ul></div>
<div class="example">
<a name="id2668883"></a><p class="title"><b>Example 7.5. Атрибут <em class="parameter"><code>item</code></em></b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$arr = array(1000, 1001, 1002);
$smarty-&gt;assign('myArray', $arr);
?&gt;

  </pre>
<p>
    Шаблон для отображения <em class="parameter"><code>$myArray</code></em> в виде
    ненумерованного списка
   </p>
<pre class="programlisting">

&lt;ul&gt;
{foreach from=$myArray item=foo}
    &lt;li&gt;{$foo}&lt;/li&gt;
{/foreach}
&lt;/ul&gt;

  </pre>
<p>
   Результат выполнения данного примера:
  </p>
<pre class="screen">

&lt;ul&gt;
    &lt;li&gt;1000&lt;/li&gt;
    &lt;li&gt;1001&lt;/li&gt;
    &lt;li&gt;1002&lt;/li&gt;
&lt;/ul&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2668941"></a><p class="title"><b>Example 7.6. Пример работы атрибутов <em class="parameter"><code>item</code></em> и <em class="parameter"><code>key</code></em></b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$arr = array(9 =&gt; 'Tennis', 3 =&gt; 'Swimming', 8 =&gt; 'Coding');
$smarty-&gt;assign('myArray', $arr);
?&gt;

  </pre>
<p>
    Шаблон для отображения <em class="parameter"><code>$myArray</code></em> в виде пар ключ/значение,
    как <a class="ulink" href="http://php.net/foreach" target="_top"><code class="varname">foreach</code></a>
    в PHP.</p>
<pre class="programlisting">

&lt;ul&gt;
{foreach from=$myArray key=k item=v}
   &lt;li&gt;{$k}: {$v}&lt;/li&gt;
{/foreach}
&lt;/ul&gt;

  </pre>
<p>
   Результат выполнения данного примера:
  </p>
<pre class="screen">

&lt;ul&gt;
    &lt;li&gt;9: Tennis&lt;/li&gt;
    &lt;li&gt;3: Swimming&lt;/li&gt;
    &lt;li&gt;8: Coding&lt;/li&gt;
&lt;/ul&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2669014"></a><p class="title"><b>Example 7.7. {foreach} с ассоциативным атрибутом <em class="parameter"><code>item</code></em></b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
$items_list = array(23 =&gt; array('no' =&gt; 2456, 'label' =&gt; 'Salad'),
                    96 =&gt; array('no' =&gt; 4889, 'label' =&gt; 'Cream')
                    );
$smarty-&gt;assign('items', $items_list);
?&gt;

  </pre>
<p>
    Шаблон для отображения элементов <em class="parameter"><code>$items</code></em>, в котором
    <em class="parameter"><code>$myId</code></em> используется в URL'е
   </p>
<pre class="programlisting">

&lt;ul&gt;
{foreach from=$items key=myId item=i}
  &lt;li&gt;&lt;a href="item.php?id={$myId}"&gt;{$i.no}: {$i.label}&lt;/li&gt;
{/foreach}
&lt;/ul&gt;

  </pre>
<p>
   Результат выполнения данного примера:
  </p>
<pre class="screen">

&lt;ul&gt;
  &lt;li&gt;&lt;a href="item.php?id=23"&gt;2456: Salad&lt;/li&gt;
  &lt;li&gt;&lt;a href="item.php?id=96"&gt;4889: Cream&lt;/li&gt;
&lt;/ul&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2669082"></a><p class="title"><b>Example 7.8. {foreach} со вложенными <em class="parameter"><code>item</code></em> и <em class="parameter"><code>key</code></em></b></p>
<div class="example-contents">
<p>В Smarty передан такой массив, ключ которого содержит ключ для каждого перебираемого значения.</p>
<pre class="programlisting">

&lt;?php
 $smarty-&gt;assign('contacts', array(
                             array('phone' =&gt; '1',
                                   'fax' =&gt; '2',
                                   'cell' =&gt; '3'),
                             array('phone' =&gt; '555-4444',
                                   'fax' =&gt; '555-3333',
                                   'cell' =&gt; '760-1234')
                             ));
?&gt;

  </pre>
<p>Шаблон для отображения <em class="parameter"><code>$contact</code></em>.</p>
<pre class="programlisting">

{foreach name=outer item=contact from=$contacts}
  &lt;hr /&gt;
  {foreach key=key item=item from=$contact}
    {$key}: {$item}&lt;br /&gt;
  {/foreach}
{/foreach}

  </pre>
<p>
   Результат выполнения данного примера:
  </p>
<pre class="screen">

&lt;hr /&gt;
  phone: 1&lt;br /&gt;
  fax: 2&lt;br /&gt;
  cell: 3&lt;br /&gt;
&lt;hr /&gt;
  phone: 555-4444&lt;br /&gt;
  fax: 555-3333&lt;br /&gt;
  cell: 760-1234&lt;br /&gt;

  </pre>
</div>
</div>
<br class="example-break"><div class="example">
<a name="id2669163"></a><p class="title"><b>Example 7.9. Пример использования {foreachelse} при работе с базой данных</b></p>
<div class="example-contents">
<p>
   Пример работы с базой данных (при помощи PEAR или ADODB) в скрипте поиска,
   результаты которого передаются в Smarty.
  </p>
<pre class="programlisting">

&lt;?php
  $search_condition = "WHERE name LIKE '$foo%' ";
  $sql = 'SELECT contact_id, name, nick FROM contacts '.$search_condition.' ORDER BY name';
  $smarty-&gt;assign('results', $db-&gt;getAssoc($sql) );
?&gt;

  </pre>
<p>
   Шаблон отобразит сообщение <span class="quote">“<span class="quote">Ничего не найдено</span>”</span> при помощи
   <code class="varname">{foreachelse}</code> в случае, если поиск не дал результатов.
  </p>
<pre class="programlisting">

{foreach key=cid item=con from=$results}
    &lt;a href="contact.php?contact_id={$cid}"&gt;{$con.name} - {$con.nick}&lt;/a&gt;&lt;br /&gt;
{foreachelse}
    Ничего не найдено
{/foreach}

  </pre>
</div>
</div>
<br class="example-break"><div class="sect2" title=".index">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.index"></a>.index</h3></div></div></div>
<p>
   <em class="parameter"><code>index</code></em> contains the current array index, starting with zero.
  </p>
<div class="example">
<a name="id2669249"></a><p class="title"><b>Example 7.10. <em class="parameter"><code>index</code></em> example</b></p>
<div class="example-contents"><pre class="programlisting">

{* The header block is output every five rows *}
&lt;table&gt;
{foreach from=$items key=myId item=i name=foo}
  {if $smarty.foreach.foo.index % 5 == 0}
     &lt;tr&gt;&lt;th&gt;Title&lt;/th&gt;&lt;/tr&gt;
  {/if}
  &lt;tr&gt;&lt;td&gt;{$i.label}&lt;/td&gt;&lt;/tr&gt;
{/foreach}
&lt;/table&gt;

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".iteration">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.iteration"></a>.iteration</h3></div></div></div>
<p>
   <em class="parameter"><code>iteration</code></em> содержит значение текущей итерации цикла
   и всегда начинается с единицы, в отличие от
   <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>.
   Это значение увеличивается на единицу с каждой следующей итерацией.
  </p>
<div class="example">
<a name="id2669315"></a><p class="title"><b>Example 7.11. Примеры работы с <em class="parameter"><code>iteration</code></em> и <em class="parameter"><code>index</code></em></b></p>
<div class="example-contents"><pre class="programlisting">

{* этот шаблон выведет 0|1, 1|2, 2|3, ... и т.д. *}
{foreach from=$myArray item=i name=foo}
    {$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
{/foreach}

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".first">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.first"></a>.first</h3></div></div></div>
<p>
   Свойство <em class="parameter"><code>first</code></em> равно <code class="constant">TRUE</code>, если текущая итерация
   <code class="varname">{foreach}</code> - первая.
  </p>
<div class="example">
<a name="id2669377"></a><p class="title"><b>Example 7.12. Пример использования свойства <em class="parameter"><code>first</code></em></b></p>
<div class="example-contents"><pre class="programlisting">

{* отображаем "НОВОЕ" напротив первого элемента, иначе id *}
&lt;table&gt;
{foreach from=$items key=myId item=i name=foo}
&lt;tr&gt;
  &lt;td&gt;{if $smarty.foreach.foo.first}НОВОЕ{else}{$myId}{/if}&lt;/td&gt;
  &lt;td&gt;{$i.label}&lt;/td&gt;
&lt;/tr&gt;
{/foreach}
&lt;/table&gt;

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".last">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.last"></a>.last</h3></div></div></div>
<p>
   Свойство <em class="parameter"><code>last</code></em> равно <code class="constant">TRUE</code>, если текущая итерация
   <code class="varname">{foreach}</code> - последняя.
  </p>
<div class="example">
<a name="id2669436"></a><p class="title"><b>Example 7.13. Пример использования свойства <em class="parameter"><code>last</code></em></b></p>
<div class="example-contents"><pre class="programlisting">

{* Добавляем горизонтальную полосу (&lt;hr /&gt;) в конце списка *}
{foreach from=$items key=part_id item=prod name=products}
  &lt;a href="#{$part_id}"&gt;{$prod}&lt;/a&gt;{if $smarty.foreach.products.last}&lt;hr /&gt;{else},{/if}
{foreachelse}
  ... content ...
{/foreach}

  </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" title=".show">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.show"></a>.show</h3></div></div></div>
<p>
   <em class="parameter"><code>show</code></em> используется как параметр для <code class="varname">{foreach}</code>.
   <em class="parameter"><code>show</code></em> - это булевое значение.
   Если оно равно <code class="constant">FALSE</code>, результат работы <code class="varname">{foreach}</code> не будет отображен.
   Если присутствует директива <code class="varname">{foreachelse}</code>, её содержимое
   будет отображено.
  </p>
</div>
<div class="sect2" title=".total">
<div class="titlepage"><div><div><h3 class="title">
<a name="foreach.property.total"></a>.total</h3></div></div></div>
<p>
   <em class="parameter"><code>total</code></em> содержит общее количество итераций,
   которое пройдет данный цикл <code class="varname">{foreach}</code>.
   Его можно использовать во время или после выполнения <code class="varname">{foreach}</code>.
  </p>
<div class="example">
<a name="id2669551"></a><p class="title"><b>Example 7.14. Пример использования свойства <em class="parameter"><code>total</code></em></b></p>
<div class="example-contents"><pre class="programlisting">

{* отображаем количество отображенных строк в конце *}
{foreach from=$items key=part_id item=prod name=foo}
{$prod.name}&lt;hr/&gt;
{if $smarty.foreach.foo.last}
  &lt;div id="total"&gt;{$smarty.foreach.foo.total} предметов&lt;/div&gt;
{/if}
{foreachelse}
 ... что-то другое ...
{/foreach}

  </pre></div>
</div>
<br class="example-break"><p>
   См. также
   <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>
   и
   <a class="link" href="language.variables.smarty.html#language.variables.smarty.loops" title="{$smarty.section}, {$smarty.foreach}"><em class="parameter"><code>$smarty.foreach</code></em></a>.
  </p>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="language.builtin.functions.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">{config_load} </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> {if},{elseif},{else}</td>
</tr>
</table>
</div>
</body>
</html>
